#include <iostream>
#include <string>
#include <map>
#include <mutex>
#include <vector>
#include <memory>

// 模拟资源管理类
class ResourceManager {
private:
  std::mutex m_mutex_;
  std::map<int, std::string> m_resources_;

public:
  bool has_resource(int id) const {
    return m_resources_.find(id) != m_resources_.end();
  }

  std::string get_resource(int id) const {
    auto it = m_resources_.find(id);
    return (it != m_resources_.end()) ? it->second : "";
  }

  void add_resource(int id, const std::string& name) {
    m_resources_[id] = name;
  }

  std::mutex& get_mutex() { return m_mutex_; }
};

// 模拟获取值的函数
int get_value() {
  return 42;
}

// 模拟获取状态的函数
enum class Status { SUCCESS, ERROR, PENDING };
Status get_status() {
  return Status::SUCCESS;
}

void demonstrate_if_switch_init() {
  std::cout << "  C++17 if/switch 初始化器演示:\n\n";

  // 1. if语句中的初始化器
  std::cout << "  1. if语句中的初始化器:\n";

  // 在if条件中初始化变量
  if (int x = get_value(); x > 0) {
    std::cout << "    x = " << x << " 是正数\n";
  } else {
    std::cout << "    x = " << x << " 不是正数\n";
  }

  // 结合复杂类型
  if (std::vector<int> vec = {1, 2, 3, 4, 5}; !vec.empty()) {
    std::cout << "    向量有 " << vec.size() << " 个元素\n";
    std::cout << "    第一个元素: " << vec[0] << "\n";
  }

  // 结合锁的使用
  ResourceManager rm;
  rm.add_resource(1, "Resource1");
  
  if (std::lock_guard<std::mutex> lock(rm.get_mutex()); rm.has_resource(1)) {
    std::cout << "    资源1存在: " << rm.get_resource(1) << "\n";
    // lock在这里自动释放
  }

  // 2. switch语句中的初始化器
  std::cout << "\n  2. switch语句中的初始化器:\n";

  // 在switch中初始化变量
  switch (int value = get_value(); value) {
    case 42:
      std::cout << "    值是42，是答案\n";
      break;
    case 0:
      std::cout << "    值是0\n";
      break;
    default:
      std::cout << "    值是 " << value << "\n";
      break;
  }

  // 结合枚举
  switch (Status status = get_status(); status) {
    case Status::SUCCESS:
      std::cout << "    状态: 成功\n";
      break;
    case Status::ERROR:
      std::cout << "    状态: 错误\n";
      break;
    case Status::PENDING:
      std::cout << "    状态: 等待中\n";
      break;
  }

  // 3. 复杂示例：文件操作
  std::cout << "\n  3. 复杂示例 - 条件资源管理:\n";

  // 模拟文件操作
  if (std::unique_ptr<std::string> content = std::make_unique<std::string>("Hello");
      content && !content->empty()) {
    std::cout << "    内容: " << *content << "\n";
    std::cout << "    内容长度: " << content->length() << "\n";
  }

  // 4. 嵌套使用
  std::cout << "\n  4. 嵌套使用:\n";

  if (int outer = 10; outer > 0) {
    if (int inner = outer * 2; inner > 15) {
      std::cout << "    外层值: " << outer << ", 内层值: " << inner << "\n";
    }
  }

  // 5. 结合结构化绑定
  std::cout << "\n  5. 结合结构化绑定:\n";

  std::map<std::string, int> scores = {
    {"Alice", 95},
    {"Bob", 87},
    {"Charlie", 92}
  };

  if (auto [name, score] = *scores.begin(); score > 90) {
    std::cout << "    " << name << " 的分数 " << score << " 很高\n";
  }

  // 6. 实际应用场景：错误处理
  std::cout << "\n  6. 实际应用场景 - 错误处理:\n";

  auto check_and_process = [](int value) {
    if (int processed = value * 2; processed > 100) {
      std::cout << "    处理后的值 " << processed << " 大于100，需要特殊处理\n";
      return true;
    } else {
      std::cout << "    处理后的值 " << processed << " 小于等于100，正常处理\n";
      return false;
    }
  };

  check_and_process(60);
  check_and_process(30);

  // 7. if constexpr 与初始化器结合
  std::cout << "\n  7. if constexpr 与初始化器结合:\n";

  // 注意：if constexpr的条件必须是编译时常量
  constexpr bool debug = true;
  if constexpr (debug) {
    std::cout << "    调试模式开启\n";
  }

  // 8. 优势说明
  std::cout << "\n  if/switch初始化器的优势:\n";
  std::cout << "  - 限制变量作用域，提高代码安全性\n";
  std::cout << "  - 避免变量泄漏到外部作用域\n";
  std::cout << "  - 结合RAII模式，自动资源管理\n";
  std::cout << "  - 代码更清晰，意图更明确\n";
  std::cout << "  - 减少命名冲突的可能性\n";
}

